#pragma once
#include <cstddef>
#include <atomic>
#include <array>

namespace My_MemoryPool
{

    /**
     * constexpr 告诉编译器：“这个值在编译时就能确定，不需要等到程序运行时再计算”。
     * 代码运行时没有计算开销（直接使用编译后的固定值）。编译器可以进行更深度的优化（例如直接替换为常量值）。
     * 类型安全，替代宏定义
     */

    constexpr size_t ALIGNMENT =8;  //内存对齐的基准单位（8字节）。 在64位系统中，指针大小是8字节
    constexpr size_t MAX_BYTES = 256*1024;  // 256kb
    constexpr size_t FREE_LIST_SIZE = MAX_BYTES /ALIGNMENT; // ALIGNMENT等于指针void*的大小  总共有 MAX_BYTES / ALIGNMENT = 32768 种块大小（每次增加8字节）

    // 内存块头部信息
    struct  BlockHeader
    {
        size_t size; //内存块大小
        bool inUse; //使用标记
        BlockHeader * next; //指向下一个内存块
    };
    
    // 大小类管理
    class SizeClass
    {
    public:
        static size_t roundUp(size_t bytes)
        {
            return (bytes+ALIGNMENT-1)&~(ALIGNMENT-1);
        }

        static size_t getIndex(size_t bytes)
        {
            // 确保bytes至少为ALIGNMENT
            bytes = std::max(bytes,ALIGNMENT);
            //向上取整后减1  37/8 = 4 -1 =3
            return (bytes+ALIGNMENT-1)/ALIGNMENT-1;
        }
    };
}

